package com.zhyt.intelligentpipeline.model;

import com.zhyt.intelligentpipeline.vo.WorkingTypeConst;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResidualStrength {


    //管道公称壁厚 t
    @NotBlank(message = "管道公称壁厚必须填写")
    private double pipeNominalWallThickness;

    //标准中规定的最小拉伸强度  MPa SMTS
    @NotBlank(message = "标准中规定的最小拉伸强度必须填写")
    private double tensileStrength;

    //腐蚀缺陷深度  mm   d
    @NotBlank(message = "腐蚀缺陷深度都必须填写")
    private double corrosionDefectDepth;


    //管道外径  mm  D
    @NotBlank(message = "管道外径必须填写")
    private double pipeOuterDiameter;

    //腐蚀缺陷长度  mm  l
    @NotBlank(message = "腐蚀缺陷长度必须填写")
    private double corrosionDefectLength;


    //模型系数  F1 默认值0.9
    private double modelCoefficient  = 0.9;

    //操作使用系数  F2  默认值0.72
    private double usingCoefficients = 0.72;

    //管道设计压力
    @NotBlank(message = "管道设计压力必须填写")
    private double DesignPressure;

    private String msg;

    /**
     * 计算腐蚀管道的失效压力 P(f) 已检验
     * 管道外径、管道壁厚、腐蚀缺陷深度、腐蚀缺陷长度、
     *
     * 计算公式：
     *       Pf = (numericalValue)/(denominatorValue)
     *       numericalValue = 2 * t * SMTS * (1 - (d/t))
     *       denominatorValue  = (D - t) * (1 - d / (t * Q))
     *
     * */
    public static double getFailurePressure(ResidualStrength residualStrength){
        double part1 = 2 * residualStrength.getPipeNominalWallThickness() * residualStrength.getTensileStrength() *
                (1 - (residualStrength.getCorrosionDefectDepth() / residualStrength.getPipeNominalWallThickness()));
        double part2 = (residualStrength.getPipeOuterDiameter() - residualStrength.getPipeNominalWallThickness()) *
                (1 - (residualStrength.getCorrosionDefectLength() /
                        (residualStrength.getPipeNominalWallThickness() * getLengthCorrection(residualStrength))
                    )
                );
        return part1 / part2;
    }

    /**
     * 计算长度校准系数 已检验
     * 这里对数据进行开平方需要知道数据的精度
     *   计算公式：
     *       Q = sqrt(value,2)
     *       value  = 1 + 0.3 *
     * */
    public static double getLengthCorrection(ResidualStrength residualStrength){
        return Math.sqrt(1 + 0.31 *
                Math.pow(
                        residualStrength.getCorrosionDefectLength() /
                                Math.sqrt(residualStrength.getPipeOuterDiameter() *
                                        residualStrength.getPipeNominalWallThickness()),2));
    }

    /**
     * 计算腐蚀管道的安全工作压力 已检验:
     * F1,F2 传入参数如果小于 0 则使用默认值
     * 公式：
     *      P(sw) = F * P(f)
     *      F为总使用系数
     *          F = F(1) * F(2)
     *              F(1) : 模型系数，通常取0.9
     *              F(2) : 操作使用系数是为保证含缺陷管道运行中能有一个安全裕度，取值通常与管道设计系数相等，一般取值为0.72。
     * */
    public static double getSafeWorkingPressure(ResidualStrength residualStrength){
        //计算总使用系数
        double F = residualStrength.getModelCoefficient() * residualStrength.getUsingCoefficients();

       return F * ResidualStrength.getFailurePressure(residualStrength);
    }

}
